home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / scripts / struct.pl < prev    next >
Perl Script  |  1997-05-23  |  5KB  |  191 lines

  1. #!/usr/bin/perl
  2. #
  3. # Copyright (c) 1997, Kenneth Albanowksi
  4. #
  5. # Licensed under GPL v2.
  6.  
  7. # Turn struct definition into portable set of access routines
  8.  
  9. $example = "
  10.  
  11. /* begin struct xyz
  12.  *   Char aa
  13.  *   Word a
  14.  *   DWord b
  15.  *   SWord c 
  16.  *   Char[foo][bar] d
  17.  *   Byte e
  18.  *   DWord[5][bar] e2
  19.  *   DWord[5][5] e2
  20.  *   Char[5] f
  21.  *   Char[0] g
  22.  * struct access */
  23. #define get_name_a(ptr) get_short(ptr)
  24. #define get_name_b(ptr) get_long(ptr+2)
  25. #define get_name_c(ptr) get_sshort(ptr+6)
  26. #define ptr_name_d(ptr) ptr+8
  27. #define get_name_d(ptr,idx)
  28. #define sizeof_name     28
  29.  /* end struct xyz */
  30.  
  31. /* begin struct abc
  32.  *  Char a
  33.  *  Char b
  34.  *  Char c
  35.  *  Word d
  36.  * end struct abc 
  37.  */
  38.  
  39. /* begin struct abc
  40.  *  Char a
  41.  *  Char b
  42.  *  Char c
  43.  *  Word d
  44.  * struct access */
  45. /* struct offsets */
  46.  * end struct abc */
  47. ";
  48.  
  49. %sizes = (    Word => 2, SWord => -2, DWord => 4, SDWord => -4, CharPtr => 4,
  50.             Char => 1, Boolean => 1, Byte => 1, Handle => 4, Ptr => 4,
  51.             DlpDateTimeType => 8);
  52. %access = ( 1 => "byte", 2 => "short", 3 => "treble", 4 => "long",
  53.            -1 => "sbyte", -2 => "sshort", -3 => "streble", -4 => "slong",
  54.            8 => "date");
  55.  
  56.  
  57. $items = undef;
  58. $name = undef;
  59. while(<>) {
  60.     if (m!^\s*/\*\s*begin\s+struct\s+(\S+)!) {
  61.         $name = $1;
  62.         @e=();
  63.         $pos = "0";
  64.         $npos = 0;
  65.         $items = $name;
  66.         print;
  67.     } elsif (defined $name and m!/*\s*end\s+struct\s+$endname!) {
  68.         print;
  69.         $name = undef;
  70.         $items = undef;
  71.     } elsif (defined $name and m!\*\s*\s+struct\s+access\s*\*/!) {
  72.         $pos = "0";
  73.         $npos = 0;
  74.         print;
  75.         foreach (@e) {
  76.             my($pos, $type,$array,$item) = @$_;
  77.             my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
  78.             if ($array)  {
  79.                 my(@array) = @$array;
  80.                 my($offset) = join("*",$size,@array[1..$#array]);
  81.                 print "#define get_${name}_$item(ptr,idx)    get_$access((ptr)+$pos+$offset*(idx))\n";
  82.                 print "#define set_${name}_$item(ptr,idx,val)    set_$access((ptr)+$pos+$offset*(idx),(val))\n";
  83.                 print "#define ptr_${name}_$item(ptr,idx)    ((ptr)+$pos+$offset*(idx))\n";
  84.             } else {
  85.                 print "#define get_${name}_$item(ptr)        get_$access((ptr)+$pos)\n";
  86.                 print "#define set_${name}_$item(ptr,val)    set_$access((ptr)+$pos,(val))\n";
  87.             }
  88.         }
  89.         print "#define sizeof_$name        ($len)\n";
  90.         $items = undef;
  91.     } elsif (defined $name and m!\*\s*struct\s+offsets\s*\*/!) {
  92.         $pos = "0";
  93.         $npos = 0;
  94.         print;
  95.         foreach (@e) {
  96.             my($pos, $type,$array,$item) = @$_;
  97.             my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
  98.             print "#define ${name}_$item        ($pos)\n";
  99.         }
  100.         print "#define sizeof_$name        ($len)\n";
  101.         $items = undef;
  102.     } elsif (defined $name and m!\*\s*struct\s+read\s+access\s*\*/!) {
  103.         $pos = "0";
  104.         $npos = 0;
  105.         print;
  106.         foreach (@e) {
  107.             my($pos, $type,$array,$item) = @$_;
  108.             my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
  109.             if ($array)  {
  110.                 my(@array) = @$array;
  111.                 my($offset) = join("*",$size,@array[1..$#array]);
  112.                 print "#define ${name}_$item(ptr,idx)    get_$access((ptr)+$pos+$offset*(idx))\n";
  113.                 print "#define ptr_${name}_$item(ptr,idx)    ((ptr)+$pos+$offset*(idx))\n";
  114.             } else {
  115.                 print "#define ${name}_$item(ptr)        get_$access((ptr)+$pos)\n";
  116.             }
  117.         }
  118.         print "#define sizeof_$name        ($len)\n";
  119.         $items = undef;
  120.     } elsif (defined $name and m!\*\s*struct\s+write\s+access\s*\*/!) {
  121.         $pos = "0";
  122.         $npos = 0;
  123.         print;
  124.         foreach (@e) {
  125.             my($pos, $type,$array,$item) = @$_;
  126.             my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
  127.             if ($array)  {
  128.                 my(@array) = @$array;
  129.                 my($offset) = join("*",$size,@array[1..$#array]);
  130.                 print "#define ${name}_$item(ptr,idx,val)    set_$access((ptr)+$pos+$offset*(idx),(val))\n";
  131.                 print "#define ptr_${name}_$item(ptr,idx)    ((ptr)+$pos+$offset*(idx))\n";
  132.             } else {
  133.                 print "#define ${name}_$item(ptr,val)        set_$access((ptr)+$pos,(val))\n";
  134.             }
  135.         }
  136.         print "#define sizeof_$name        ($len)\n";
  137.         $items = undef;
  138.     } elsif (defined $items and m!^\s*\*\s+(\S+?)((\[\S+?\])*)\s+(\S+)!) {
  139.         my($type,$array,$name) = ($1,$2,$4);
  140.         my(@array);
  141.         push @array, $1 while $array =~ m/\[(.*?)\]/g;
  142.         my($size,$access) = ($sizes{$type},$access{$sizes{$type}});
  143.  
  144.         if ($size>1 and $npos & 1) {
  145.             $pos =~ s/(\*\d+)$/$1+0/;
  146.             $pos =~ s/(\d+)$/$1+1/e;
  147.             $npos++;
  148.         }
  149.  
  150.         push @e, [$pos, $type, (@array ? \@array : undef),$name];
  151.  
  152.         s/([ \t]*)(\S+\(.*?\))?\s*$/(length($1) ? $1 : "\t\t") . "$access($pos)\n"/e;
  153.  
  154.         if (@array)  {
  155.             my($offset) = join("*",$size,@array[1..$#array]);
  156.             #$pos .= "+" . ;
  157.             $x = $size;
  158.             $textpos = 0;
  159.             foreach (@array) {
  160.                 $x *= $_;
  161.                 if (/\D/) {
  162.                     $textpos = 1;
  163.                 }
  164.             }
  165.             if ($textpos) {
  166.                 $pos .= "+" .join("*", @array, $size);
  167.                 $npos += 0;
  168.             } else {
  169.                 $pos =~ s/(\*\d+)$/$1+0/;
  170.                 $pos =~ s/(\d+)$/$1+$x/e;
  171.                 $npos += $x;
  172.             }
  173.         } else {
  174.             $s = abs($size);
  175.             $pos =~ s/(\*\d+)$/$1+$s/;
  176.             $pos =~ s/(\d+)$/$1+$s/e;
  177.             $npos += $s;
  178.         }
  179.         $len = $pos;
  180.         print;
  181.     } elsif (defined $name) {
  182.         if (m!/\*\s*end\s+struct\s+$endname!) {
  183.             print;
  184.             $items = undef;
  185.             $name= undef;
  186.         }
  187.     } else {
  188.         print;
  189.     }
  190. }
  191.